package com.meimeixia.pattern.singleton.demo3;

/**
 * 线程安全
 * @author: t-zhijiang.zhao
 * @date: 2024/11/26 上午9:15
 */
public class Singleton3 {
    // 私有构造方法
    private Singleton3() {
    }

    // 声明Singleton类型的变量instance
    private static Singleton3 instance;

    // 对外提供访问方式
    public static synchronized Singleton3 getInstance() {
        // 判断instance是否为null，如果为null，那么说明还没有创建Singleton类的对象
        // 如果没有创建的话，那么我们就创建一个并返回；如果有创建，那么直接返回即可
        if (instance == null) {
            // 线程1等待，线程2获取到cpu的执行权，也会进入到该判断里面
            instance = new Singleton3();
        }
        return instance;
    }
    /*由于涉及到多线程，如果我们暂时不创建多线程的话，那么是演示不出来效果的，而且即使创建出来多线程，也不一定能演示出来效果，所以，我们只好做如下分析了。
    假设线程1现在拿到了cpu的执行权，它在调用getInstance方法时，首先肯定是要做一个判断的，做完判断之后，它会进入到判断里面。此时，
    如果线程2拿到了cpu的执行权，那么线程1就会处于等待状态，这样，当线程2调用getInstance方法时，线程2现在还能进入到判断里面吗？很显然，进不来，
    因为这里面有一个同步锁，而线程1还在判断里面等待，它并没有释放这个同步锁，所以线程2是进不来的，它只能在外面等着。那么这样的话，线程2就只能等线程1执行完，
    而线程1执行完，就意味着instance变量已经被赋好值了，如此一来，就解决掉了线程不安全的问题了。
    因此，以上两种实现方式要进行选择的话，我们肯定首选线程安全的这种实现方式。
    */
}
